package com.example.erat.common;

import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

/**
 * 文件工具类
 */
public class FileUtils {

    /**
     * 上传文件
     * @param file 上传的文件
     * @param uploadDir 上传目录
     * @return 保存后的文件名
     */
    public static String uploadFile(MultipartFile file, String uploadDir) throws IOException {
        // 检查上传目录是否存在，不存在则创建
        File dir = new File(uploadDir);
        if (!dir.exists()) {
            boolean success = dir.mkdirs();
            if (!success) {
                throw new IOException("创建上传目录失败: " + uploadDir);
            }
        }
        
        // 生成唯一文件名
        String originalFilename = file.getOriginalFilename();
        String fileExtension = getFileExtension(originalFilename);
        String fileName = UUID.randomUUID().toString() + fileExtension;
        
        // 保存文件
        Path filePath = Paths.get(uploadDir, fileName);
        Files.write(filePath, file.getBytes());
        
        return fileName;
    }

    /**
     * 下载文件
     * @param file 要下载的文件
     * @param response HTTP响应
     */
    public static void downloadFile(File file, HttpServletResponse response) {
        if (file == null || !file.exists()) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        
        try (InputStream is = new FileInputStream(file);
             OutputStream os = response.getOutputStream()) {
            
            // 设置响应头
            response.reset();
            response.setContentType("application/octet-stream");
            response.setCharacterEncoding("utf-8");
            response.setContentLength((int) file.length());
            response.setHeader("Content-Disposition", 
                    "attachment;filename=" + URLEncoder.encode(file.getName(), StandardCharsets.UTF_8));
            
            // 输出文件
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = is.read(buffer)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.flush();
        } catch (IOException e) {
            // 记录错误日志
            e.printStackTrace();
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }

    /**
     * 删除文件
     * @param filePath 文件路径
     * @return 删除结果
     */
    public static boolean deleteFile(String filePath) {
        if (filePath == null || filePath.isEmpty()) {
            return false;
        }
        
        File file = new File(filePath);
        if (file.exists() && file.isFile()) {
            return file.delete();
        }
        return false;
    }

    /**
     * 获取文件扩展名
     * @param fileName 文件名
     * @return 扩展名，包含点号（如 .jpg）
     */
    public static String getFileExtension(String fileName) {
        if (fileName == null || fileName.isEmpty()) {
            return "";
        }
        
        int lastIndex = fileName.lastIndexOf('.');
        if (lastIndex == -1) {
            return "";
        }
        
        return fileName.substring(lastIndex);
    }

    /**
     * 获取不带扩展名的文件名
     * @param fileName 文件名
     * @return 不带扩展名的文件名
     */
    public static String getFileNameWithoutExtension(String fileName) {
        if (fileName == null || fileName.isEmpty()) {
            return "";
        }
        
        int lastIndex = fileName.lastIndexOf('.');
        if (lastIndex == -1) {
            return fileName;
        }
        
        return fileName.substring(0, lastIndex);
    }
}    